﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace SatisKarsilastirma
{
    public class HareketUst
    {
        List<HareketDetay> _lines = new List<HareketDetay>();
        Decimal[] matrahlar = new decimal[10];
        Decimal[] kdvTutarlari = new decimal[10];

        public decimal[] KdvMatrahlari { get { return matrahlar; } }
        public decimal[] KdvTutarlari { get { return kdvTutarlari; } }
        public int FisNo { get; set; }
        public int LineNo { get; set; }
        public int KasaNo { get; set; }
        public int MagazaNo { get; set; }
        public bool Iptal { get; set; }
        public string BelgeNo { get; set; }
        public byte BelgeTipi { get; set; }
        public DateTime Tarih { get; set; }
        public DateTime BitisTarihi { get; set; }
        public decimal Tutar { get; set; }
        public decimal NakitOdeme { get; set; }
        public decimal KrediKartiOdeme { get; set; }
        public string CariKodu { get; set; }
        public List<HareketDetay> Satirlar { get { return _lines; } }
        public string Seri { get; set; }
    }

    public class HareketDetay
    {
        public int KdvDepartmani { get; set; }
        public decimal KdvOrani { get; set; }
        public decimal Miktar { get; set; }
        public decimal BirimFiyat { get; set; }
        public decimal Tutar { get; set; }
        public decimal KdvTutari { get; set; }
        public string Barkodu { get; set; }
        public int LineNo { get; set; }
        public string StokKodu { get; set; }
    }

    public class Rapor
    {
        public string MagazaAdi { get; set; }

        public decimal GeniusSatisTutari { get; set; }
        public decimal MikroSatisTutari { get; set; }
        public decimal SatisFark { get; set; }


        public decimal GeniusIadeTutari { get; set; }
        public decimal MikroIadeTutari { get; set; }
        public decimal IadeFark { get; set; }


        public int GeniusBelgeSayisi { get; set; }
        public int MikroBelgeSayisi { get; set; }
        public decimal BelgeFark { get; set; }


        public int GeniusIadeSayisi { get; set; }
        public int MikroIadeSayisi { get; set; }
        public decimal IadeBelgeFarki { get; set; }
    }

    public class Aktarim
    {
        Mikro mk = new Mikro();



        public Rapor OncekiGunSatisi(DateTime tarih, Depo dp)
        {
            Rapor rpr = new Rapor();
            rpr.MagazaAdi = dp.Adi;
            try
            {
                string filename = dp.Yol + "\\gn" + tarih.Year.ToString() + tarih.Month.ToString("00") + tarih.Day.ToString("00") + ".log";
                if (File.Exists(filename))
                {
                    File.Copy(filename, Application.StartupPath + "\\tmp.log", true);
                    var liste = ReadSaleFile(Application.StartupPath + "\\tmp.log", tarih, 0).ToArray();
                    File.Delete(Application.StartupPath + "\\tmp.log");


                    rpr.GeniusBelgeSayisi = liste.Where(x => x.BelgeTipi < 2).Count();
                    rpr.GeniusIadeSayisi = liste.Where(x => x.BelgeTipi == 2).Count();
                    rpr.GeniusSatisTutari = liste.Where(x => x.BelgeTipi < 2).Select(x => x.Tutar).Sum();
                    rpr.GeniusIadeTutari = liste.Where(x => x.BelgeTipi == 2).Select(x => x.Tutar).Sum();
                }

                using (SqlConnection cn = new SqlConnection(Sessions.Get.CnnString))
                {
                    cn.Open();
                    using (SqlCommand cmd = new SqlCommand(string.Format("SELECT     po_Fisfatura AS Tip, COUNT(po_RECno) AS Sayi, SUM(po_BelgeToplam) AS Tutar FROM         O_{0}_{1} GROUP BY po_Fisfatura", tarih.Year.ToString() + tarih.Month.ToString("00") + tarih.Day.ToString("00"), dp.No.ToString("000")), cn))
                    {
                        SqlDataReader rd = cmd.ExecuteReader();
                        while (rd.Read())
                        {
                            if (Cevir.Parse<int>(rd[0]) == 0)
                            {
                                rpr.MikroIadeSayisi = Cevir.Parse<int>(rd[1]);
                                rpr.MikroIadeTutari = Cevir.Parse<decimal>(rd[2]);
                            }
                            else
                            {
                                rpr.MikroBelgeSayisi += Cevir.Parse<int>(rd[1]);
                                rpr.MikroSatisTutari += Cevir.Parse<decimal>(rd[2]);
                            }
                        }
                    }
                    cn.Close();
                }
            }
            catch (Exception ex)
            {
                Logging.GetLog.ErrorLog(ex);
            }

            rpr.SatisFark = rpr.GeniusSatisTutari - rpr.MikroSatisTutari;
            rpr.IadeFark = rpr.GeniusIadeTutari - rpr.MikroIadeTutari;
            rpr.BelgeFark = rpr.GeniusBelgeSayisi - rpr.MikroBelgeSayisi;
            rpr.IadeBelgeFarki = rpr.GeniusIadeSayisi - rpr.MikroIadeSayisi;

            return rpr;
        }

        public List<HareketUst> ReadSaleFile(string fileName, DateTime tarih, int sonsatir)
        {
            List<HareketUst> lines = new List<HareketUst>();
            using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                using (StreamReader sr = new StreamReader(fs))
                {
                    bool basla = false;
                    string date = tarih.Year.ToString() + tarih.Month.ToString("00") + tarih.Day.ToString("00");
                    string line = "";
                    HareketUst ust = null;
                    int satir = 0;
                    while (sr.Peek() > -1)
                    {
                        line = sr.ReadLine();

                        //if (!string.IsNullOrEmpty(line))
                        //{
                        //    if (line.Substring(19, 2) == "RH" && line.Substring(32, 8) == date)
                        //    {
                        basla = true;
                        //    }
                        //}


                        if (basla)
                        {
                            if (!string.IsNullOrEmpty(line))
                            {
                                switch (line.Substring(19, 2))
                                {
                                    case "RH": //fiş başı
                                        satir = 0;
                                        ust = new HareketUst();
                                        ust.FisNo = Cevir.Parse<int>(line.Substring(0, 6));
                                        ust.LineNo = Cevir.Parse<int>(line.Substring(6, 4));
                                        ust.KasaNo = Cevir.Parse<int>(line.Substring(10, 3));
                                        ust.MagazaNo = Cevir.Parse<int>(line.Substring(13, 6));
                                        ust.Iptal = Cevir.Parse<bool>(line.Substring(21, 1));
                                        ust.Tarih = line.Substring(32, 14).toDate();
                                        ust.BitisTarihi = line.Substring(46, 14).toDate();
                                        ust.BelgeTipi = Cevir.Parse<byte>(line.Substring(70, 1));
                                        ust.Tutar = line.Substring(75, 15).toDecimal();
                                        ust.CariKodu = "";
                                        ust.BelgeNo = "";
                                        break;
                                    case "IS":
                                        //if (line.Substring(21, 1) == "1") //iptal satır
                                        //{
                                        //    string barkod = line.Substring(85, 24).Trim();
                                        //    decimal miktar = Cevir.Parse<decimal>(line.Substring(32, 6));
                                        //    if (line.Substring(38, 1) == "1")
                                        //    {
                                        //        miktar = miktar / 1000m;
                                        //    }

                                        //    var hr = ust.Satirlar.Where(x => x.Barkodu == barkod).ToList();
                                        //    List<HareketDetay> sil = new List<HareketDetay>();
                                        //    foreach (HareketDetay item in hr)
                                        //    {
                                        //        if (item.Miktar <= miktar)
                                        //        {
                                        //            sil.Add(item);
                                        //            miktar -= item.Miktar;
                                        //        }
                                        //        else
                                        //        {
                                        //            item.Miktar -= miktar;
                                        //            break;
                                        //        }
                                        //    }

                                        //    foreach (var item in sil)
                                        //    {
                                        //        ust.Satirlar.Remove(item);
                                        //    }
                                        //}
                                        //else //normal satırı
                                        //{
                                        //    HareketDetay dt = new HareketDetay();
                                        //    dt.KdvDepartmani = Cevir.Parse<int>(line.Substring(28, 2));
                                        //    dt.KdvOrani = Cevir.Parse<decimal>(line.Substring(30, 2));
                                        //    dt.Miktar = Cevir.Parse<decimal>(line.Substring(32, 6));
                                        //    if (line.Substring(38, 1) == "1")
                                        //    {
                                        //        dt.Miktar = dt.Miktar / 1000m;
                                        //    }
                                        //    dt.BirimFiyat = line.Substring(39, 15).toDecimal();
                                        //    dt.Tutar = line.Substring(54, 15).toDecimal() / ((dt.KdvOrani + 100m) / 100m);
                                        //    dt.KdvTutari = line.Substring(54, 15).toDecimal() - (line.Substring(54, 15).toDecimal() / ((dt.KdvOrani + 100m) / 100m));
                                        //    dt.Barkodu = line.Substring(85, 24).Trim();
                                        //    dt.LineNo = satir;
                                        //    ust.KdvMatrahlari[dt.KdvDepartmani] += line.Substring(54, 15).toDecimal() / ((dt.KdvOrani + 100m) / 100m);
                                        //    ust.KdvTutarlari[dt.KdvDepartmani - 1] += dt.KdvTutari;
                                        //    ust.Satirlar.Add(dt);
                                        //}

                                        satir++;
                                        break;
                                    case "PY":
                                    //if (line.Substring(125, 2) == "99")
                                    //{
                                    //    if (line.Substring(24, 2) == "01") //kredi
                                    //    {
                                    //        ust.KrediKartiOdeme += line.Substring(26, 15).toDecimal();
                                    //    }
                                    //    else
                                    //    {
                                    //        ust.NakitOdeme += line.Substring(26, 15).toDecimal();
                                    //    }
                                    //}
                                    //else if (line.Substring(125, 2) == "00")
                                    //{
                                    //    if (line.Substring(24, 2) == "01") //kredi
                                    //    {
                                    //        ust.KrediKartiOdeme -= line.Substring(26, 15).toDecimal();
                                    //    }
                                    //    else
                                    //    {
                                    //        ust.NakitOdeme -= line.Substring(26, 15).toDecimal();
                                    //    }
                                    //}
                                    //else
                                    //{
                                    //    ust.NakitOdeme += ust.Tutar;
                                    //}
                                    //break;
                                    case "VF":
                                        //ust.KdvDep1Tutari = line.Substring(24, 15).toDecimal();
                                        //ust.KdvDep2Tutari = line.Substring(40, 15).toDecimal();
                                        //ust.KdvDep3Tutari = line.Substring(55, 15).toDecimal();
                                        //ust.KdvDep4Tutari = line.Substring(70, 15).toDecimal();
                                        //ust.KdvDep5Tutari = line.Substring(85, 15).toDecimal();
                                        break;
                                    case "DF":
                                        //ust.KdvDep1Matrahi = line.Substring(24, 15).toDecimal();
                                        //ust.KdvDep2Matrahi = line.Substring(40, 15).toDecimal();
                                        //ust.KdvDep3Matrahi = line.Substring(55, 15).toDecimal();
                                        //ust.KdvDep4Matrahi = line.Substring(70, 15).toDecimal();
                                        //ust.KdvDep5Matrahi = line.Substring(85, 15).toDecimal();
                                        lines.Add(ust);
                                        break;
                                }
                            }
                        }

                    }
                    sr.Close();
                }
                fs.Close();
            }
            return lines;
        }
    }
}
